<?php

// (c) 2000 MY, Inc.
// Unauthorized use punishable by torture, mutilation, and vivisection.

class Exts_Db_Table_Abstract extends Zend_Db_Table_Abstract {

	protected $_rowClass = 'Exts_Db_Table_Row_Abstract';
	protected $_rowsetClass = 'Exts_Db_Table_Rowset_Abstract';
	protected $_config;
	protected $_foreigns = array(); /* foreigns es un array con la forma
	  [accesor=>array(id_en_otra_tabla, clase_table, tipo_de_relacion)].
	  Al configurar este valor se podra hacer $row->accesor
	  y retornara un array de filas o una fila */
	protected $_owners = array();  /* owners es un array con la forma accesor=>array(id_en_esta_tabla, clase_table) te devuelve el owner */

	/**
	 * Se ejecuta al instanciar un modelo.
	 *
	 */
	public function init() {
		/**
		 * Guardamos la config en la variable $this->_config
		 */
		if (Zend_Registry::isRegistered('config')) {
			$this->_config = Zend_Registry::get('config');
		}
		parent::init();
	}

	/**
	 * Metodo generico para enviar el contenido a un sitemap, si necesitan
	 * modificarlo se puede hookear
	 * #hookeable
	 * @return array
	 * 
	 */
	public function getAllToSitemap() {
		$rowset = $this->getAdapter()->fetchAll(
				$this->getAdapter()->select()->from($this->_name, array('name'))
		);
		return $rowset;
	}

	/** Guarda un contenido . Si se pasa el id dentro de las bind, se busca si
	 * exisite, en ese caso se actualiza, en caso contrario se crea un row .
	 *
	 * @param array $bind
	 * @return int IdContenido
	 */
	public function save($bind) {
		if (@isset($bind[$this->_primary])) {
			$row = $this->find($bind[$this->_primary])->current();
			if (!count($row)) {
				$row = $this->createRow();
			}
		} else {
			$row = $this->createRow();
		}

		$row->setFromArray($bind);
		return $row->save();
	}

	/**
	 * Devuelve X registros aleatorios 
	 * @param int $limit cantidad de registros a devolver
	 */
	public function getRandom($limit) {
		$rand = rand(0, 9999);
		$rowset = $this->fetchAll(
					$this->select()
					->order(new Zend_Db_Expr('RAND(' . $rand . ')'))
					->limit($limit)
		);
		if (count($rowset)) {
			return $rowset;
		}
		return array();
	}

	/**
	 * Devuelve un string apto para usar como parametro en una url
	 *
	 * @param string $url
	 * @return string
	 */
	public function seourl($url) {
		$url = utf8_decode($url);
		// Tranformamos todo a minusculas

		$url = strtolower($url);
		// Añadimos los guiones

		$find = array(' ', '&', '\r\n', '\n', '+');
		$url = str_replace($find, '-', $url);

		//Rememplazamos caracteres especiales latinos
		$find = array('á', 'é', 'í', 'ó', 'ú', 'ñ');

		$repl = array('a', 'e', 'i', 'o', 'u', 'n');

		$url = str_replace($find, $repl, $url);


		// Eliminamos y Reemplazamos demás caracteres especiales

		$find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/');

		$repl = array('', '-', '');

		$url = preg_replace($find, $repl, $url);

		return $url;
	}

	public function _makeNewRowset($rows, $readonly = false) {

		$rowArray = array();
		foreach ($rows as $row) {
			$rowArray[] = $row->toArray();
		}

		$data = array(
			'table' => $this,
			'data' => $rowArray,
			'readOnly' => $readonly,
			'rowClass' => $this->getRowClass(),
			'stored' => true
		);

		$rowsetClass = $this->getRowsetClass();
		if (!class_exists($rowsetClass)) {
			require_once 'Zend/Loader.php';
			Zend_Loader::loadClass($rowsetClass);
		}
		return new $rowsetClass($data);
	}

}
